package com.gary;

/**
 * 移动零
 *
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 *
 * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 *
 *
 *
 * 示例 1:
 *
 * 输入: nums = [0,1,0,3,12]
 * 输出: [1,3,12,0,0]
 *
 * 示例 2:
 *
 * 输入: nums = [0]
 * 输出: [0]
 * @author peng_rui
 * @date 2022/3/7
 */
public class MoveZero {
    public static void main(String[] args) {
        int[] nums = new int[]{9,8,7,5,10,0,9,0,1,0,3,12,0};
        moveZeroes(nums);
        for (int num : nums) {
            System.out.print(num + " ");
        }
    }

    /**
     * 双指针法
     * i 表示 0的个数
     * j 从头到尾走
     * j - i 表示最前面0的位置
     * 当 nums[j] != 0  交换 j-i 与 j 的位置
     * 否则 i++
     * 全程 j++
     * @param nums
     */
    private static void moveZeroes(int[] nums) {
        int i = 0;
        for (int j = 0; j < nums.length; j++) {
            if (nums[j] == 0) {
                i++;
            } else if (i != 0){
                nums[j - i] = nums[j];
                nums[j] = 0;
            }
        }
    }


    /**
     * 愚蠢的办法
     * @param nums
     */
    public static void moveZeroesOK1(int[] nums) {
        int count0 = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                for (int j = i; j < nums.length - 1; j++) {
                    nums[j] = nums[j + 1];
                }
                count0++;
                i--;
            }
            if (count0 == nums.length) {
                return;
            }
        }
        int tail = nums.length - 1;
        for (int i = 0; i < count0; i++) {
            nums[tail--] = 0;
        }
    }
}
